﻿using NDK.Utils;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NDK.Module.StationLogic
{
    public enum PLCInPut
    {
        心跳,
        暂停状态,
        异常状态,
        上料安全信号,
        下料安全信号,
        上料拍照,
        上料到位,
        上料离开,
        取料到位1,
        取料离开1,
        取料到位2,
        取料离开2,
        清料模式,
   
        下料机械手真空1报警,
        下料机械手真空2报警,
        爪1有产品无测试结果,
        爪2有产品无测试结果,
        爪1有测试结果无产品,
        爪2有测试结果无产品,
        机械手爪1升降气管不在原点,
        机械手爪1升降气管不在动点,
        机械手爪2升降气管不在原点,
        机械手爪2升降气管不在动点,
        Tray盘防呆感应器报警,
        Tray盘到位感应器报警,
        Tray盘缓存感应器报警,
        入料口感应信号异常,
        顶升Tray限位感应器报警,
        Tray盘数量高度限位感应器报警,
        料仓安全光栅报警,
        空Tray料盘分盘气缸1不在动点,
        空Tray料盘分盘气缸1不在原点,
        空Tray料盘分盘气缸2不在动点,
        空Tray料盘分盘气缸2不在原点,
        OK料盘定位气缸不在动点,
        OK料盘定位气缸不在原点,
        NG料盘定位气缸不在动点,
        NG料盘定位气缸不在原点,
        上料皮带拍照超时,
        上料机械手真空报警
    }

    public enum PLCOutPutBool
    {
        心跳,
        启动,
        停止,
        复位,
        手自动,
        暂停状态,
        异常状态,
        安全信号,
        定位OK,
        定位NG,
        上料放料允许,
        上料离开允许,
        下料取料允许1,
        下料离开允许1,
        下料取料允许2,
        下料离开允许2,
        穴1有料,
        穴2有料,
        PC远程控制PLC,
        整机清料信号,
        GRR模式,
        量测清料完成,
        GRR模式上料皮带可转动,

    }

    public enum PLCOutPutInt
    {
        穴1结果,
        穴2结果
    }

    public enum PLCOutPutReal
    {
        补偿X,
        补偿Y,
        补偿R
    }

    public class PLCAdress
    {
        public Dictionary<PLCInPut, string> DicInput { get; set; }

        public Dictionary<PLCInPut, bool> DicInPutValue { get; set; }

        public Dictionary<PLCOutPutBool, string> DicOutPutBool { get; set; }

        public Dictionary<PLCOutPutInt, string> DicOutPutInt { get; set; }

        public Dictionary<PLCOutPutReal, string> DicOutPutReal { get; set; }

        public PLCAdress()
        {
            var dt = FileUtils.OpenCSV($"{Application.StartupPath}\\Config\\PLCAdress.csv");
            var dicAdress = new Dictionary<string, Dictionary<string, string>>();
            foreach (DataRow Dr in dt.Rows)
            {
                if (!dicAdress.ContainsKey(Dr["Type"].ToString()))
                {
                    dicAdress.Add(Dr["Type"].ToString(), new Dictionary<string, string>());
                }
                if (!dicAdress[Dr["Type"].ToString()].ContainsKey(Dr["Name"].ToString()))
                {
                    dicAdress[Dr["Type"].ToString()].Add(Dr["Name"].ToString(), Dr["Adress"].ToString());
                }
            }

            DicInPutValue = new Dictionary<PLCInPut, bool>();
            DicInput = new Dictionary<PLCInPut, string>();
            DicOutPutBool = new Dictionary<PLCOutPutBool, string>();
            DicOutPutInt = new Dictionary<PLCOutPutInt, string>();
            DicOutPutReal = new Dictionary<PLCOutPutReal, string>();
            foreach (PLCInPut item in Enum.GetValues(typeof(PLCInPut)))
            {
                DicInPutValue.Add(item, false);
                DicInput.Add(item, dicAdress["PLC"][item.ToString()]);
            }
            foreach (PLCOutPutBool item in Enum.GetValues(typeof(PLCOutPutBool)))
            {
                DicOutPutBool.Add(item, dicAdress["PCBool"][item.ToString()]);
            }
            foreach (PLCOutPutInt item in Enum.GetValues(typeof(PLCOutPutInt)))
            {
                DicOutPutInt.Add(item, dicAdress["PCInt"][item.ToString()]);
            }
            foreach (PLCOutPutReal item in Enum.GetValues(typeof(PLCOutPutReal)))
            {
                DicOutPutReal.Add(item, dicAdress["PCReal"][item.ToString()]);
            }
        }
    }
}
